Next: Calling Functions, Previous: Function Names, Up: Functions [Contents][Index]
We usually give a name to a function when it is first created.
This is called defining a function, and it is done with
the defun macro.
defun is the usual way to define new Lisp
functions. It defines the symbol name as a
function with argument list args and body forms
given by body. Neither name nor
args should be quoted.
doc, if present, should be a string specifying
the function’s documentation string (see Function
Documentation). declare, if present, should be
a declare form specifying function metadata (see
Declare Form).
interactive, if present, should be an
interactive form specifying how the function is
to be called interactively (see Interactive
Call).
The return value of defun is undefined.
Here are some examples:
(defun foo () 5)
(foo)
⇒ 5
(defun bar (a &optional b &rest c)
(list a b c))
(bar 1 2 3 4 5)
⇒ (1 2 (3 4 5))
(bar 1)
⇒ (1 nil nil)
(bar) error→ Wrong number of arguments.
(defun capitalize-backwards () "Upcase the last letter of the word at point." (interactive) (backward-word 1) (forward-word 1) (backward-char 1) (capitalize-word 1))
Be careful not to redefine existing functions
unintentionally. defun redefines even primitive
functions such as car without any hesitation or
notification. Emacs does not prevent you from doing this,
because redefining a function is sometimes done deliberately,
and there is no way to distinguish deliberate redefinition
from unintentional redefinition.
This function defines the symbol name as a function, with definition definition (which can be any valid Lisp function). Its return value is undefined.
If doc is non-nil, it becomes the
function documentation of name. Otherwise, any
documentation provided by definition is
used.
Internally, defalias normally uses
fset to set the definition. If name
has a defalias-fset-function property, however,
the associated value is used as a function to call in place
of fset.
The proper place to use defalias is where a
specific function name is being defined—especially
where that name appears explicitly in the source file being
loaded. This is because defalias records which
file defined the function, just like defun (see
Unloading).
By contrast, in programs that manipulate function
definitions for other purposes, it is better to use
fset, which does not keep such records. See
Function
Cells.
You cannot create a new primitive function with
defun or defalias, but you can use them
to change the function definition of any symbol, even one such as
car or x-popup-menu whose normal
definition is a primitive. However, this is risky: for instance,
it is next to impossible to redefine car without
breaking Lisp completely. Redefining an obscure function such as
x-popup-menu is less dangerous, but it still may not
work as you expect. If there are calls to the primitive from C
code, they call the primitive’s C definition directly, so
changing the symbol’s definition will have no effect on
them.
See also defsubst, which defines a function like
defun and tells the Lisp compiler to perform inline
expansion on it. See Inline
Functions.
Alternatively, you can define a function by providing the code which will inline it as a compiler macro. The following macros make this possible.
Define a function name by providing code that does its inlining, as a compiler macro. The function will accept the argument list args and will have the specified body.
If present, doc should be the function’s
documentation string (see Function
Documentation); declare, if present, should be
a declare form (see Declare Form) specifying
the function’s metadata.
Functions defined via define-inline have several
advantages with respect to macros defined by
defsubst or defmacro:
mapcar (see Mapping
Functions).cl-defsubst (see
Argument Lists in Common Lisp Extensions for GNU
Emacs Lisp).Like defmacro, a function inlined with
define-inline inherits the scoping rules, either
dynamic or lexical, from the call site. See Variable
Scoping.
The following macros should be used in the body of a function
defined by define-inline.
Quote expression for
define-inline. This is similar to the backquote
(see Backquote), but
quotes code and accepts only ,, not
,@.
This is is similar to let (see Local Variables):
it sets up local variables as specified by
bindings, and then evaluates body with
those bindings in effect. Each element of bindings
should be either a symbol or a list of the form
(var expr)
; the result is to evaluate expr and
bind var to the result. The tail of
bindings can be either nil or a
symbol which should hold a list of arguments, in which case
each argument is evaluated, and the symbol is bound to the
resulting list.
Return non-nil if the value of
expression is already known.
Return the value of expression.
Signal an error, formatting args according to format.
Here’s an example of using
define-inline:
(define-inline myaccessor (obj)
(inline-letevals (obj)
(inline-quote (if (foo-p ,obj) (aref (cdr ,obj) 3) (aref ,obj 2)))))
This is equivalent to
(defsubst myaccessor (obj) (if (foo-p obj) (aref (cdr obj) 3) (aref obj 2)))
Next: Calling Functions, Previous: Function Names, Up: Functions [Contents][Index]